package mall.service;

import mall.pojo.ProductDO;
import mall.utils.ProductJudgeUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 货架服务
 * @author zmy
 */
public class ShelfService {
    private List<ProductDO> shelf = new ArrayList<>();

    /** 单例 - 双重检查 */
    private static volatile ShelfService instance;
    private ShelfService(){}
    public static ShelfService getInstance() {
        if (instance == null) {
            synchronized (ShelfService.class) {
                if (instance == null) {
                    instance = new ShelfService();
                }
            }
        }
        return instance;
    }

    /** 查看货架商品 */
    public void showGoods() {
        shelf.forEach(System.out::println);
        System.out.println();
    }

    /**
     * 新增商品
     * @param productDO 商品信息
     */
    public void addGood(ProductDO productDO) {
        if (productDO == null || productDO.getId() == null) {
            System.out.println("添加的商品信息错误！");
        } else if (getProductById(productDO.getId()) != null) {
            System.out.println("商品已存在，只能操作库存或者删除商品！");
        } else {
            shelf.add(productDO);
            System.out.println("新增成功！\n");
        }
    }

    /**
     * 根据商品 ID 新增库存数量
     * @param productId 商品ID
     * @param count     数量
     */
    public void addQuantity(String productId, int count) {
        ProductDO addTarget = getProductById(productId);
        if (!ProductJudgeUtil.equalsId(addTarget, productId)) {
            System.out.println("要新增的商品：" + productId + "，不存在！");
            return;
        }
        addTarget.setQuantity(addTarget.getQuantity() + count);
        System.out.println("新增成功，当前信息：" + addTarget);
    }

    /**
     * 根据 ID 删除商品
     * @param productId 商品ID
     */
    public void deleteProductById(String productId) {
        ProductDO delTarget = getProductById(productId);
        if (!ProductJudgeUtil.equalsId(delTarget, productId)) {
            System.out.println("要删除的商品：" + productId + "，不存在！");
            return;
        }
        shelf.remove(delTarget);
        System.out.println("删除" + delTarget + "成功！");
    }

    /**
     * 减少商品数量
     * @param productId 商品 ID
     * @param count     数量
     */
    public void reduceGood(String productId, int count) {
        Optional<ProductDO> productDO = shelf.stream()
                .filter(p -> ProductJudgeUtil.equalsId(p, productId))
                .findFirst();

        productDO.ifPresentOrElse(p ->{
            if (count < 0) {
                System.out.println("购买数量有误！");
            }else if (p.getQuantity() - count < 0) {
                System.out.println("所选商品：" + p.getId() + " " + p.getName() + ", 库存不足！");
            } else {
                for (ProductDO product : shelf) {
                    if (ProductJudgeUtil.equalsId(product, productId)) {
                        Integer quantity = product.getQuantity();
                        product.setQuantity(quantity - count);
                        break;
                    }
                }
            }
        }, ()->{
            System.out.println("选择的商品:" + productId + "，不存在！");
        });
    }

    /**
     * 根据商品ID查询商品信息
     * @param id    商品ID
     * @return 商品查找结果
     */
    public ProductDO getProductById(String id) {
        ProductDO product = null;
        for (ProductDO p : shelf) {
            if (ProductJudgeUtil.equalsId(p, id)) {
                product = p;
                break;
            }
        }

        return product;
    }
}
